/**
 * @author LKQ
 * @date 2021/12/12 17:43
 * @description 双指针标准写法
 */
public class FormalSolution {
    public static void main(String[] args) {
        FormalSolution formalSolution = new FormalSolution();
        int[] nums = {0, 1, 2, 2, 3, 0, 4, 2};
        formalSolution.removeElement2(nums, 2);
    }

    public int removeElement(int[] nums, int val) {
        // 此情况下，双指针初始位置均为0，时间复杂度为O(n)，遍历该序列次数 <= 2.
        int n = nums.length;
        int left = 0;
        for (int right = 0; right < n; right++) {
            if (nums[right] != val) {
                nums[left] = nums[right];
                left++;
            }
        }
        return left;
    }

    public int removeElement2(int[] nums, int val) {
        // 此情况下，双指针左指针在0，右指针为 nums.length, 时间复杂度为O(n)，遍历该序列次数 == 1.
        int left = 0;
        int right = nums.length;
        while (left < right) {
            if (nums[left] == val) {
                nums[left] = nums[right - 1];
                right--;
            } else {
                left++;
            }
        }
        return left;
    }

}
